// import _ from "lodash"

// _.cloneDeep({})

//测试

function test(){
  
}

// let array = []
// let obj = {}
// JSON.stringify(obj) === "{}"
// Object.keys(obj)  //=> ["id",'name']

function deepClone(obj, hash = new Map()) {
    /**
     * (步骤一：判断传递进来的数据是否符合要求)
     */
    if (obj === null) return obj; // 如果是null或者undefined我就不进行拷贝操作
    if (obj instanceof Date) return new Date(obj);
    if (obj instanceof RegExp) return new RegExp(obj);
    // 可能是对象或者普通的值  如果是函数的话是不需要深拷贝
    if (typeof obj !== "object") return obj;
    // 是对象的话就要进行深拷贝
    if (hash.get(obj)) return hash.get(obj);


    /**
     * 根据你传递进来的对象，创建一个新对象
     * obj的构造器，获取到了过后可以直接new 跟obj一样的对象
     */
    let cloneObj = new obj.constructor();
    // 找到的是所属类原型上的constructor,而原型上的 constructor指向的是当前类本身
    hash.set(obj, cloneObj);

    /**
     * 进行判断和递归
     */
    for (let key in obj) {
      if (obj.hasOwnProperty(key)) {
            // 实现一个递归拷贝
            cloneObj[key] = deepClone(obj[key], hash);
        
      }
    }
    return cloneObj;
  }

//   deepClone(obj)

/**
 * 原型和原型链
 * (1)js这门语言特点：若类型语言，采用原型和原型链来实现对象构造继承
 * (2)只要定义了一个类，这个类的原型对象就已经产生了。 Classes.prototype
 * 每一个实例对象，都有一个隐氏的属性，c1.__proto__
 * c1.__proto__ == Classes.prototype === true
 * 
 * 原型链：
 * 获取一个属性或者方法。
 * 首先创建一个实例出来。会现在这个实例本身去寻找。如果找不到原型对象上面寻找。
 * 
 */
class Classes{

}



const c1 = new Classes()
c1.__proto__

console.log(Classes.prototype == c1.__proto__)

const c2 = new Classes()
c2.__proto__


console.log(c1.__proto__ == c2.__proto__)

class Array{
    
}
Array.prototype.find = function(){

}
const temp1 = new Array()
temp1.find()
const temp2 = new Array()

c1.toString()


